/**
 * 游戏常量和配置
 */

// 花色
export const SUITS = {
  DIAMOND: '♦', // 方块
  SPADE: '♠',   // 黑桃
  HEART: '♥',   // 红桃
  CLUB: '♣'     // 梅花
}

// 牌面值
export const RANKS = {
  '5': 5,
  '6': 6,
  '7': 7,
  '8': 8,
  '9': 9,
  '10': 10,
  'J': 11,
  'Q': 12,
  'K': 13,
  'A': 14
}

// 牌型
export const CARD_TYPES = {
  SINGLE: 1,      // 单牌
  PAIR: 2,        // 对子
  TRIPLE: 3,      // 三张
  BOMB: 4,        // 炸弹(3张及以上)
  STRAIGHT: 5,    // 顺子(5张及以上连续)
  CONSECUTIVE_PAIRS: 6  // 连对(3对及以上)
}

// 游戏状态
export const GAME_STATUS = {
  WAITING: 0,     // 等待中
  READY: 1,       // 准备中
  PLAYING: 2,     // 游戏中
  FINISHED: 3     // 已结束
}

// 房间最大人数
export const MAX_PLAYERS = 4

// 每人牌数
export const CARDS_PER_PLAYER = 10

/**
 * 生成完整牌组(40张)
 */
export function generateDeck() {
  const deck = []
  const suits = Object.values(SUITS)
  const ranks = Object.keys(RANKS)
  
  suits.forEach(suit => {
    ranks.forEach(rank => {
      deck.push({
        suit,
        rank,
        value: RANKS[rank],
        id: `${suit}${rank}`
      })
    })
  })
  
  return deck
}

/**
 * 洗牌算法
 */
export function shuffleDeck(deck) {
  const shuffled = [...deck]
  for (let i = shuffled.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]
  }
  return shuffled
}

/**
 * 发牌
 */
export function dealCards(deck, playerCount = 4) {
  const hands = Array(playerCount).fill(null).map(() => [])
  
  deck.forEach((card, index) => {
    hands[index % playerCount].push(card)
  })
  
  return hands
}

/**
 * 判断是否是黑A或梅花A
 */
export function isBlackA(card) {
  return (card.rank === 'A' && (card.suit === SUITS.SPADE || card.suit === SUITS.CLUB))
}

/**
 * 判断是否是红A
 */
export function isRedA(card) {
  return (card.rank === 'A' && (card.suit === SUITS.HEART || card.suit === SUITS.DIAMOND))
}

/**
 * 牌排序（从大到小）
 */
export function sortCards(cards) {
  return cards.sort((a, b) => {
    if (a.value !== b.value) {
      return b.value - a.value
    }
    // 同值按花色排序：黑桃 > 红桃 > 梅花 > 方块
    const suitOrder = { [SUITS.SPADE]: 4, [SUITS.HEART]: 3, [SUITS.CLUB]: 2, [SUITS.DIAMOND]: 1 }
    return suitOrder[b.suit] - suitOrder[a.suit]
  })
}
